package aplicacion.database;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.Time;
import java.util.ArrayList;

import org.eclipse.swt.graphics.Color;

import algoritmo.Cuadrante;

public interface i_Database {

	public static final String tablaContratos = "contrato";
	public static final String tablaContratosPorDepartamento = "contratodepartamento";
	public static final String tablaDepartamentos = "departamento";
	public static final String tablaUsuariosPorDepartamento = "departamentousuario";
	public static final String tablaDestinatariosMensaje = "destinatario";
	public static final String tablaDistribucionHorarios = "distribucion";
	public static final String tablaFestivos = "festivos";
	public static final String tablaIncidencias = "incidencias";
	public static final String tablaIssues = "issues";
	public static final String tablaTurnosPorContrato = "listaturnosporcontrato";
	public static final String tablaMensajes = "mensaje";
	public static final String tablaNumerosPorDepartamento = "numerosdepartamentos";
	public static final String tablaOpiniones = "opinion";
	public static final String tablaPermisos = "permisos";
	public static final String tablaIncidenciasPorUsuario = "tieneincidencia";
	public static final String tablaTrabaja = "trabaja";
	public static final String tablaTurnos = "turnos";
	public static final String tablaUsuarios = "usuario";
	public static final String tablaVentas = "ventas";
	public static final String tablaSugerencias = "sugerencias";


	public abstract void setConfig(String userName, String password, String ip, String dbName);
	
	/**
	 * Abre una conexión nueva con la base de datos
	 */
	public abstract boolean abrirConexion();

	/**
	 * Método que elimina un contrato de la base de datos
	 * 
	 * @param id Identificador del contrato
	 * @return Informa sobre si se ha podido realizar el borrado o no
	 */
	public abstract boolean borraContrato(int id);

	/**
	 * Metodo que borra un turno que pertenecia a un contrato
	 * @param idContrato	el identificador del contrato a eliminar
	 * @return	si se ha realizado correctamente la eliminacion
	 */
	public abstract boolean borraContratoConTurnos(int idContrato);

	/**
	 * Metodo que borra de la base de datos un contrato que pertenecia a un departamento
	 * @param idContrato el identificador del contrato a eliminar
	 * @return	si se ha realizado correctamente la eliminación
	 */
	public abstract boolean borraContratosDepartamento(int idContrato);

	/**
	 * Método que elimina de la base de datos al departamento cuyo nombre se
	 * facilita
	 * 
	 * @param nombre
	 *            Nombre del departamento
	 * @return Informa sobre si se ha podido realizar el borrado o no
	 */
	public abstract boolean borraDepartamento(String nombre);

	/**
	 * Borra un empleado de la BD
	 * @param NumVendedor
	 * @return True si todo va bien, false si algo ha fallado
	 * 
	 */
	public abstract boolean borraEmpleado(int NumVendedor);

	/**
	 * Método que elimina un mensaje de la base de datos
	 * 
	 * @param id
	 *            Identificador del mensaje
	 * @return Informa sobre si se ha podido realizar el borrado o no
	 */
	public abstract boolean borraMensaje(int id);

	/**
	 * Borra el periodo de un mes indicado por los parámetros de
	 * @param mes identifica el mes del periodo a borrar
	 * @param anio identifica el anio del periodo a borrar
	 * @param dep identifica el departamento 
	 * @return si se ha realizado correctamente la eliminacion
	 */
	public abstract boolean borraMesTrabaja(int dia, int mes, int anio,
			String dep);

	/**
	 * Metodo que elimina de la base de datos la fila de la tabla DepartamentoUsuario
	 * cuyo nombre de departamento coincide con el que se pasa por parametro
	 * @param nombre Nombre del departamento
	 * @return	Informa sobre si se ha podido realizar el borrado o no
	 */
	public abstract boolean borraNombreDepartamentoUsuario(String nombre);

	/**
	 * Metodo que elimina de la base de datos la fila de la tabla NumerosDEPARTAMENTOs
	 * cuyo nombre de departamento coincide con el que se pasa por parametro
	 * @param nombre Nombre del departamento
	 * @return	Informa sobre si se ha podido realizar el borrado o no
	 */
	public abstract boolean borraNumerosDepartamentos(String nombre);

	/**
	 * Método que elimina un turno de la base de datos
	 * 
	 * @param id
	 *            Identificador del turno
	 * @return Informa sobre si se ha podido realizar el borrado o no
	 */
	public abstract boolean borraTurno(int id);

	/**
	 * Metodo que borra un turno que pertenecia a un contrato
	 * @param idTurno	el identificador del turno a eliminar
	 * @return	si se ha realizado correctamente la eliminacion
	 */
	public abstract boolean borraTurnoDeContrato(int idTurno, int idContrato);

	/**
	 * Método que elimina de la base de datos al usuario cuyo NumVendedor se
	 * facilita
	 * 
	 * @param id
	 *            Número de vendedor del usuario
	 * @return Informa sobre si se ha podido realizar el borrado o no
	 */
	public abstract boolean borraUsuario(int id);

	/**
	 * Metodo que elimina de la base de datos la fila de la tabla DepartamentoUsuario
	 * cuyo numero de vendedor coincide con el que se pasa por parametro
	 * @param nv Numero de vendedor
	 * @return	Informa sobre si se ha podido realizar el borrado o no
	 */
	public abstract boolean borraUsuarioDepartamentoUsuario(int nv);

	/**
	 * Metodo que elimina de la base de datos las sugerencias de un mes de un departamento dado desde diaIni hasta diaFin
	 * @param diaIni Primer dia desde el que borrar sugerencias del mes
	 * @param diaFin Dia hasta el que borrar sugerencias del mes
	 * @param mes Mes del que borrar sugerencias
	 * @param anio Anio del mes que borrar sugerencias
	 * @param dep Departamento del que borrar sugerencias
	 * @return	Informa sobre si se ha podido realizar el borrado o no
	 */
	public abstract boolean borraSugerencias(int diaIni, int diaFin, int mes,
			int anio, String dep);

	public abstract boolean cambiaNombreDepartamento(String NombreAntiguo,
			String NombreNuevo);

	public abstract boolean cambiaNombreDepartamentoUsuario(
			String NombreAntiguo, String NombreNuevo);

	public abstract boolean cambiaNombreNumerosDEPARTAMENTOs(
			String NombreAntiguo, String NombreNuevo);

	/**
	 * Modifica un contrato en la BD. Se le pasan todos los parametros aunque no
	 * cambien
	 * 
	 * @param IdContrato
	 * @param TurnoInicial
	 * @param Nombre
	 * @param Patron
	 * @param DuracionCiclo
	 * @param Salario
	 * @param Tipo
	 * @return Devuelve un bool que dice si todo ha ido bien.
	 */
	public abstract boolean cambiarContrato(int IdContrato, int TurnoInicial,
			String Nombre, String Patron, int DuracionCiclo, double Salario,
			int Tipo);

	public abstract boolean cambiarVentas(int IdVend, Date fecha, float ventas);

	/**
	 * Modifica un empleado en la BD. Se le pasan todos los parametros aunque no
	 * cambien excepto el de HorasExtras ya que ese no lo debemos tocar
	 * @param idEmp
	 * @param nomb
	 * @param Ape1
	 * @param Ape2
	 * @param FNac
	 * @param sexo
	 * @param mail
	 * @param Passw
	 * @param grupo
	 * @param FCont
	 * @param Fentr
	 * @param Felic
	 * @param Idiom
	 * @param Rang
	 * @param Turn
	 * @param Contr
	 * @return Devuelve un bool que dice si todo ha ido bien.
	 */
	public abstract boolean cambiarEmpleado(int idEmp, String nomb,
			String Ape1, String Ape2, Date FNac, int sexo, String mail,
			String Passw, int grupo, Date FCont, Date Fentr, Date FFinCont,
			int Felic, int Idiom, int Rang, int Turn, Color color, int Contr,
			int pos);

	/**
	 * Modifica un turno en la BD. Se le pasan todos los parametros aunque no
	 * cambien
	 * 
	 * @param IdTurno
	 * @param Descripcion
	 * @param HoraEntrada
	 * @param HoraSalida
	 * @param HoraInicioDescanso
	 * @param Duracion
	 * @return Devuelve un bool que dice si todo ha ido bien.
	 */
	public abstract boolean cambiarTurno(int IdTurno, String Descripcion,
			String abreviatura, Time HoraEntrada, Time HoraSalida,
			Time HoraInicioDescanso, int Duracion, String color);

	/**
	 * Cierra la conexión con la base de datos
	 * 
	 */
	public abstract void cerrarConexion();

	/**
	 * Comprueba si hay una conexión abierta con la base de datos
	 * 
	 * @return <i>true</i> si la conexión está abierta, <i>false</i> en caso
	 *         contrario o si hay alguna excepción
	 */
	public abstract boolean conexionAbierta();

	/**
	 * Devuelve el empleado con identificador nvend
	 * 
	 * @param nvend
	 *            el identificador del empleado
	 * @return un ResultSet con el resultado de la consulta
	 */
	public abstract ResultSet dameEmpleado(int nvend);

	// como es autoincrementable he quitado el id
	/**
	 * Método que inserta un contrato en la base de datos
	 * 
	 * @param idContrato
	 *            representa el identificador del contrato
	 * @param turnoInicial
	 *            turno con el que empieza en el contrato
	 * @param nombre
	 *            nombre del contrato
	 * @param patron
	 *            distribucion de los dias que trabaja y los que no
	 * @param duracionCiclo
	 *            periodo de tiempo que le corresponde al patron
	 * @param salario
	 *            paga del empleado
	 * @return Devuelve el idContrato del nuevo contrato o -1 en caso de error
	 */
	public abstract int insertarContrato(int turnoInicial, String nombre,
			String patron, int duracionCiclo, double salario, int tipocontrato);

	/**
	 * Inserción de un Contrato asociado a un cierto Dpto.
	 * 
	 * @param nombre
	 *            el identificador del dpto.
	 * @param idContrato
	 * 			 el ID del contrato
	 * @return un ResultSet con el resultado de la consulta
	 */
	public abstract boolean insertarContratoPorDepartamento(String nombre,
			int idContrato);

	/**
	 * Método que inserta en la tabla Departamento los valores correspondientes
	 * a un nuevo departamento
	 * 
	 * @param nombre
	 *            Nombre representativo de las actividades llevadas a cabo
	 *            dentro del departamento
	 * @param jefe
	 *            Persona que dirige le departamento
	 * @return Informa sobre si se ha podido realizar la inserci�n o no
	 */
	public abstract boolean insertarDepartamento(String nombre, int jefe,
			Time hI, Time hC);

	/**
	 * Método que inserta en la tabla DepartamentoUsuario los valores
	 * correspondientes
	 * 
	 * @param nvend
	 *            Es el identificador único de cada empleado
	 * @param nombre
	 *            Nombre del departamento al que pertenece el empleado
	 * @param ultima Ejecuta las inserciones pendientes si es true, sino solo la envía
	 * @return Informa sobre si se ha podido realizar la inserción o no
	 */
	public abstract boolean insertarDepartamentoUsuario(int nvend,
			String nombre, boolean ultima);

	/**
	 * M�todo que inserta en la tabla Distribucion los valores correspondientes
	 * a una nueva distribuci�n
	 * 
	 * @param Hora
	 *            Franja horaria dividida en unidades de una hora (por ej. De
	 *            9:00 � 10:00) representado por la hora de inicio (ej. 9)
	 * 
	 * @param DiaSemana
	 *            Dia (Lunes, Martes,...,Domingo) en el que se aplica la
	 *            distribuci�n
	 * 
	 * @param Patr�n
	 *            Nos dice c�mo se distribuyen los grupos (expertos y novatos)
	 * 
	 * @param NumMax
	 *            Nos acota el n�mero m�ximo de trabajadores requeridos dicho
	 *            d�a en una cierta franja horaria
	 * 
	 * @param NumMin
	 *            Nos acota el n�mero m�nimo de trabajadores requeridos dicho
	 *            d�a en una cierta franja horaria
	 * 
	 * @param IdDepartamento
	 *            identificador del dpto.
	 * 
	 * @return Informa sobre si se ha podido realizar la inserci�n o no
	 */
	public abstract boolean insertarDistribucion(int Hora, int DiaSemana,
			String Patron, int NumMax, int NumMin, String IdDepartamento,
			boolean ultima);

	/**
	 * Método que inserta en la tabla Festivos los valores correspondientes a
	 * una distribución para días festivos o promociones
	 * 
	 * @param Hora
	 *            Franja horaria dividida en unidades de una hora (por ej. De
	 *            9:00 a 10:00) representado por la hora de inicio (ej. 9)
	 * 
	 * @param FechaInicio
	 *            Fecha de Inicio de la distribución especial para festivos o
	 *            promociones
	 * 
	 * @param FechaFin
	 *            Fecha de Finalizacion de la distribución especial para
	 *            festivos o promociones
	 * @param Patr�n
	 *            Nos dice cómo se distribuyen los grupos (expertos y novatos)
	 * 
	 * @param NumMax
	 *            Nos acota el número máximo de trabajadores requeridos dicho
	 *            día en una cierta franja horaria
	 * 
	 * @param NumMin
	 *            Nos acota el número mínimo de trabajadores requeridos dicho
	 *            día en una cierta franja horaria
	 * 
	 * @param IdDepartamento
	 *            identificador del dpto.
	 * 
	 * @return Informa sobre si se ha podido realizar la inserción o no
	 */
	public abstract boolean insertarFestivo(int Hora, Date Fecha,
			String Patron, int NumMax, int NumMin, String IdDepartamento,
			boolean ultima);

	/**
	 * Método que inserta una incidencia en la base de datos
	 * 
	 * @param idIncidencia
	 *            identificador de la incidencia
	 * @param descripcion
	 *            breve descripcion de la incidencia
	 * @return true si se ha realizado correctamente o false en caso contrario
	 */
	public abstract boolean insertarIncidencia(String descripcion);

	public abstract void insertarIssue(String texto);

	/**
	 * Método que inserta en la tabla ListaDestinatarios
	 * 
	 * @param numVendedor
	 *            representa el destinatario al que se ha enviado el mensaje
	 * @param idMensaje
	 *            representa el mensaje que se recibe
	 * @return true si se ha realizado correctamente o false en caso contrario
	 */
	public abstract boolean insertarListaDestinatarios(int numVendedor,
			int idMensaje);

	/**
	 * Método que inserta un mensaje en la base de datos
	 * 
	 * @param remitente
	 *            representa el remitente de un mensaje
	 * @param fecha
	 *            fecha en la que se ha guardado el mensaje
	 * @param asunto
	 *            campo que indica que contiene el mensaje de forma breve
	 * @param texto
	 *            contenido de los mensajes
	 * @param marcado
	 *            indica si el mensaje está marcado o no
	 * @return Informa sobre si se ha podido realizar la insercion(devuelve el
	 *         id asignado al menasaje debido al autoincremento) o no(devuelve
	 *         -1)
	 */
	// como es autoincrementable se ha quitado el id
	public abstract int insertarMensaje(int remitente, Date fecha,
			String asunto, String texto, boolean marcado, boolean visto);

	/**
	 * M�todo que inserta en la tabla NumerosDEPARTAMENTOS los valores
	 * correspondientes
	 * 
	 * @param numero
	 *            Numero del subdepartamento
	 * @param nombre
	 *            Nombre del departamento
	 * @return Informa sobre si se ha podido realizar la inserci�n o no
	 */
	public abstract boolean insertarNumerosDepartamento(int numero,
			String nombre);

	/**
	 * Metodo que inserta en la tabla TieneIncidencia
	 * 
	 * @param idIncidencia
	 *            identificador de la incidencia
	 * @param numVendedor
	 *            identificador del empleado
	 * @param fechaInicio
	 *            fecha de inicio de la incidencia
	 * @param fechaFin
	 *            fecha de finalizacion de la incidencia
	 * @return true si se ha realizado correctamente o false en caso contrario
	 */
	public abstract boolean insertarTieneIncidencia(int idIncidencia,
			int numVendedor, Time fechaInicio, Time fechaFin);

	/**
	 * Método que inserta en la tabla trabaja (que refleja los cuadrantes)
	 * 
	 * @param numVendedor
	 *            representa al trabajador
	 * @param idTurno
	 *            indica el turno con el que ha trabajado el empleado
	 * @param fecha
	 *            dia en el que un empleado a trabajado con un turno determinado
	 * @param horaEntrada
	 *            hora a la que entra a trabajar
	 * @param horaSalida
	 *            hora a la que sale
	 * @return true si se ha realizado correctamente o false en caso contrario
	 */
	public abstract boolean insertarTrabaja(int numVendedor, int idTurno,
			String fecha, Time horaEntrada, Time horaSalida, boolean ultima);

	/**
	 * Modifica la entrada en la tabla Trabaja para un empleado una fecha determinada.
	 * Además, elimina todos los turnos especiales que hubiera generados para ese empleado
	 * y ese día.
	 * Para pasar la fecha en el formato correcto, utilizar <b>aplicacion.utilidades.Util.fechaAString</b>.
	 * @param numVendedor	el vendedor al que se le cambia el horario
	 * @param idTurno		el turno nuevo
	 * @param fecha			la fecha en formato YYYY-MM-DD
	 * @return				<i>true</i> si se realiza la modificación con éxito 
	 */
	public abstract boolean modificarTrabaja(int numVendedor, int idTurno,
			String fecha);

	public abstract boolean insertarCuadrante(Cuadrante cuadrante);

	/**
	 * Método que inserta en la tabla sugerencias 
	 * 
	 * @param fecha
	 *            dia para el que existe la sugerencia
	 * @param horaInicio
	 *            hora de inicio de la sugerencia
	 * @param nombre
	 *            Nombre del departamento
	 * @param texto
	 * 			  Texto de la sugerencia
	 * @return true si se ha realizado correctamente o false en caso contrario
	 */
	public abstract boolean insertarSugerencia(Date fecha, Time horaInicio,
			String nombre, String texto);

	public abstract boolean executeBatch();

	/**
	 * Metodo que inserta un turno en la BD
	 * 
	 * @param Descripcion
	 *            Una breve descripcion del turno
	 * @param HoraEntrada
	 *            La hora de entrada en formato Time
	 * @param HoraSalida
	 *            La hora de salida en formato Time
	 * @param HoraInicioDescanso
	 *            La hora de inicio de descanso en formato Time
	 * @param Duracion
	 *            La duracion del descanso en formato int - Pendiente de
	 *            revision
	 * @return Informa sobre si se ha podido realizar la inserci�n(devuelve el
	 *         id asignado al turno debido al autoincremento) o no(devuelve -1)
	 */
	// como es autoincrementable he quitado el id
	public abstract int insertarTurno(String Descripcion, String abreviatura,
			Time HoraEntrada, Time HoraSalida, Time HoraInicioDescanso,
			int Duracion, String color);

	/**
	 * Método que inserta en ListaTurnosPorContrato
	 * 
	 * @param idTurno
	 *            identificador del turno correpondiente al contrato
	 * @param idContrato
	 *            identificador del contrato
	 * @return true si se ha realizado correctamente o false en caso contrario
	 */
	public abstract boolean insertarTurnoPorContrato(int idTurno, int idContrato);

	/**
	 * Método que inserta en la tabla usuario los valores correspondientes a un
	 * nuevo usuario
	 * 
	 * @param id
	 *            Es el identificador único de cada empleado, que se corresponde
	 *            con la clave primaria en la tabla.
	 * @param nombre
	 *            Nombre del empleado
	 * @param apellido1
	 *            Primer apellido
	 * @param apellido2
	 *            Segundo apellido
	 * @param fechaNac
	 *            Fecha de nacimiento
	 * @param sexo
	 *            Sexo del empleado
	 * @param email
	 *            Representa el correo electr�nico del empleado
	 * @param password
	 *            Se corresponde con la contraseña para autenticarse en el
	 *            sistema
	 * @param indicadorGrupo
	 *            Clasifica al usuario seg�n su antig�edad en la empresa
	 * @param fechaContrato
	 *            Fecha del primer dia en la que el usuario trabaja con el tipo
	 *            de contrato actual
	 * @param fechaEntrada
	 *            Fecha de alta en la empresa
	 * @param horasExtras
	 *            Lleva en cuenta el numero de horas extras. Debe ser un entero
	 *            para saber cuando debe horas o le deben horas
	 * @param felicidad
	 *            Grado de satisfaccion de un usuario con su horario
	 * @param idioma
	 *            Idioma de la aplicacion para el usuario
	 * @param idDept
	 *            Hace referencia a la secci�n dentro del departamento en
	 *            cuesti�n
	 * @param rango
	 *            Posici�n del empleado en la empresa
	 * @param idContrato
	 *            Hace referencia al tipo de contrato
	 * @param idTurno
	 *            Turno preferido por el empleado
	 * @return Informa sobre si se ha podido realizar la inserci�n o no
	 */
	public abstract boolean insertarUsuario(int id, String nombre,
			String apellido1, String apellido2, Date fechaNac, int sexo,
			String email, String password, int indicadorGrupo,
			Date fechaContrato, Date fechaEntrada, int horasExtras,
			int felicidad, int idioma, int rango, int idContrato, int idTurno,
			String Color, String Telefono, String Ssid, boolean HaEntrado,
			Date UltimoAcceso, int posicion, Date finContrato);

	/**
	 * Método que inserta en la tabla Ventas los valores correspondientes a cada
	 * dia para un determinado usuario
	 * 
	 * @param idUsuario
	 *            Numero que identifica al usuario
	 * 
	 * @param Fecha
	 *            String que representa un dia del año concreto. El formato es
	 *            Dd/mm/aaaa
	 * 
	 * @param NumeroVentas
	 *            Entero que representa la cantidad vendida para un determinado
	 *            dia. Valor mayor o igual a 0
	 * @return Informa sobre si se ha podido realizar la inserci�n o no
	 */

	public abstract boolean insertarVentas(int idUsuario, Date Fecha,
			float numVentas);

	/**
	 * 
	 * @param marca
	 *            marca del mensaje(true si marcar y false si desmarcar)
	 * @param id
	 *            identificador del mensaje a marcar
	 * @return Indica si se ha podido marcar o no el mensaje
	 */
	public abstract boolean marcaMensaje(boolean marca, int id);

	/**
	 * 
	 * @param marca
	 *            marca del mensaje(true si marcar y false si desmarcar)
	 * @param id
	 *            identificador del mensaje a marcar
	 * @return Indica si se ha podido marcar o no el mensaje
	 */
	public abstract boolean marcaMensajeLeido(boolean marca, int id);

	/**
	 * Cambia el jefe de Dpto. 
	 * @param Nombre
	 *            ID del Dpto.
	 * @param nvend
	 *            identificador del nuevo jefe del Dpto 'Nombre' 
	 * @return  Informa si se ha podido modificar el jefe de dpto.
	 */
	public abstract boolean modificaDepartamento(String Nombre, int nvend);

	/**
	 * Cambia el horario de un Dpto. 
	 * @param Nombre
	 *            ID del Dpto.
	 * @param hI
	 *           hora de apertura del Dpto.
	 * @param hC
	 *           hora de cierre del Dpto.
	 * @return  Informa si se ha podido modificar el horario del dpto.
	 */
	public abstract boolean modificaHorarioDepartamento(String Nombre, Time hI,
			Time hC);

	/**
	 * 
	 * @param idContrato
	 *            identificador del contrato
	 * @return la fila corrspondiente al contrato solicitado
	 */
	public abstract ResultSet obtenContrato(int idContrato);

	/**
	 * Lee las ventas de un empleado para un dia concreto
	 * @param idVend El numero de vendedor
	 * @param fecha El dia que se quiere leer en formato Date
	 * @return Un ResultSet con los datos
	 */
	public abstract ResultSet obtenVentas(int idVend, Date fecha);

	/**
	 * Lee de la BBDD las ventas de un empleado durante un año entero
	 * @param vend El numero de vendedor
	 * @param anio El año que se quiere leer
	 * @return Un ResultSet con los datos
	 */
	public abstract ResultSet obtenVentasAnio(int vend, int anio);

	public abstract ResultSet obtenVentasJefeAnio(int[] vendedores, int anio);

	/**
	 * Método que lee todos los contratos de un departamento
	 * 
	 * @param departamento el identificador del departamento
	 * @return Devuelve un ResultSet con los datos leídos de la BD
	 */
	public abstract ResultSet obtenContratosDepartamento(String departamento);

	/**
	 * Metodo que lee los datos de un mes determinado de la tabla Trabaja sin
	 * importar el departamento ni el vendedor
	 * 
	 * @param mes
	 * @param anio
	 * @return Devuelve un ResultSet con los datos leidos de la BD
	 */
	public abstract ResultSet obtenCuadrante(int mes, int anio);

	/**
	 * Método que lee los datos de un mes determinado de la tabla Trabaja 
	 * para un departamento concreto
	 * 
	 * @param mes el mes del cuadrante
	 * @param anio el año del cuadrante
	 * @param departamento el identificador del departamento
	 * @return Devuelve un ResultSet con los datos leídos de la BD
	 * 
	 * @author Daniel Dionne
	 */
	public abstract ResultSet obtenCuadrante(int mes, int anio,
			String departamento);

	/**
	 * 
	 * @param nombre
	 *            identificador del departamento
	 * @return la fila correspondiente al departamento solicitado
	 */
	public abstract ResultSet obtenDepartamento(String nombre);

	/**
	 * Metodo que devuelve de la bd los departamentos de un jefe
	 * 
	 * @param nvend
	 *            el identificador del jefe
	 * @return un ResultSet con los departamentos
	 */
	public abstract ResultSet obtenDepartamentosJefe(int nvend);

	/**
	 * lista de identificadores de mensajes que ha recibido un usuario
	 * 
	 * @param idUsuario
	 *            usuario que ha recibido los mensajes
	 * @return ResultSet con los identificadores de los mensajes
	 */
	public abstract ResultSet obtenDestinatarios(int idUsuario);

	/**
	 * Metodo que selecciona de la tabla de distribucion aquellas filas cuyo
	 * departamento y dia de la semana coincide con los pasados como parametros
	 * de la funcion
	 * 
	 * @param idDepartamento
	 * @param DiaSemana
	 *            (domingo = 0, lunes = 1....)
	 * @return ResultSet con las filas que coinciden con el departamento y el
	 *         dia de la semana
	 */
	public abstract ResultSet obtenDistribucion(String nombre, int DiaSemana);

	/**
	 * Método que selecciona de la tabla de sugerencias aquellas filas cuyo 
	 * departamento y mes coincide con los pasados como parametros de la funcion
	 * 
	 * @param mes Mes del que recuperar sugerencias
	 * @param anio Anio del mes del que recuperar sugerencias
	 * @param dep Departamento del que recuperar sugerencias
	 * @return
	 */
	public abstract ResultSet obtenSugerenciasMes(int mes, int anio, String dep);

	public abstract boolean borraDistribucion(String nombre, int DiaSemana);

	public abstract boolean setDistribucion(String nombre, int DiaSemana,
			Object[] datos, boolean ultimo);

	public abstract boolean setFestivo(String nombre, Date Fecha,
			Object[] datos, boolean ultimo);

	public abstract boolean borraFestivo(String nombre, Date Fecha);

	public abstract ResultSet obtenDistribuciones(String nombre);

	/**
	 * Carga uno o varios empleados desde la base de datos, que coincidan con
	 * los datos dados. Los parámetros pueden ser nulos.
	 * 
	 * @param idEmpl
	 *            el identificador del empleado
	 * @param idDpto
	 *            el identificador del departamento al que pertenece
	 * @param idContrato
	 *            el identificador del contrato que tiene
	 * @param nombre
	 *            el nombre del empleado
	 * @param apellido1
	 *            el primer apellido del empleado
	 * @param apellido2
	 *            el segundo apellido del empleado
	 * @return los empleados que coincidan con los datos dados
	 */
	public abstract ResultSet obtenEmpleadoAlaCarta(Integer idEmpl,
			String idDpto, Integer idContrato, String nombre, String apellido1,
			String apellido2, Integer rango);

	/**
	 * Método que obtiene los empleados que pertenecen al id del departemento
	 * dado
	 * 
	 * @param idDept
	 *            identificador de departamento
	 * @return los empleados que pertenecen al id del departemento dado
	 */
	public abstract ResultSet obtenEmpleadosDepartamento(String nombre);

	/**
	 * Metodo que selecciona de la tabla de festivos aquellas filas cuyo
	 * departamento y fecha coinciden con los parametros
	 * 
	 * @param idDepartamento
	 * @param Fecha
	 * @return ResultSet con las filas que coinciden con el departamento y la
	 *         fecha
	 */
	public abstract ResultSet obtenFestivos(String nombre, Date Fecha);

	public abstract ResultSet obtenFestivosFecha(String nombre, Date Fecha);

	public abstract ResultSet obtenFestivosMes(String nombre, int anio, int mes);

	public abstract ResultSet obtenHorarioDpto(String dpto);

	public abstract boolean setHorarioDpto(String dpto, Time entrada,
			Time salida);

	public abstract ResultSet obtenHorasTrabajoEmpleadoDia(int nv, int idturno,
			Date d);

	/**
	 * obtiene el identificador del ultimo mensaje en la base de datos
	 * 
	 * @return
	 */
	public abstract int obtenIdMensaje();

	/**
	 * Metodo que devuelve de la bd los departamentos a los que pertenece el
	 * empleado
	 * 
	 * @param nvend
	 *            el identificador del empleado
	 * @return un ResultSet con los departamentos a los que pertenece el
	 *         empleado
	 */
	public abstract ResultSet obtenIdsDepartamentos(int nvend);

	/**
	 * Metodo que obtiene los subordinados del empleado si los tuviera
	 * 
	 * @param nvend
	 *            el identificador del empleado
	 * @return un ResultSet con los subordinados del empleado si los tuviera
	 */
	public abstract ResultSet obtenIdsSubordinados(int nvend);

	/**
	 * Metodo que obtiene el ID del jefe de un Dpto
	 * 
	 * @param nombreDep
	 *            el identificador del dpto.
	 * @return un ResultSet el ID del jefe del dpto. nombreDep
	 */
	public abstract ResultSet obtenJefedeDepartamento(String nombreDep);

	/**
	 * Método que lee los empleados un departamento concreto
	 * 
	 * @param departamento el identificador del departamento
	 * @return Devuelve un ResultSet con los datos leídos de la BD
	 * 
	 * @author Daniel Dionne
	 */
	public abstract ResultSet obtenListaEmpleadosDepartamento(
			String departamento);

	/**
	 * Método que lee los empleados un departamento concreto
	 * 
	 * @param departamento el identificador del departamento
	 * @return Devuelve un ResultSet con los datos leídos de la BD
	 * 
	 * @author Daniel Dionne
	 */
	public abstract ResultSet obtenListaEmpleadosSinJefeDepartamento(
			String departamento);

	/**
	 * Listar los distintos turnos que tiene un determinado empleado.
	 * 
	 * @param idEmpl Identificador del empleado
	 * @return Todos los identificadores de turnos que tiene un determinado empleado.
	 */
	public abstract ResultSet obtenListaTurnosContrato(int idEmpl);

	/**
	 * Obtiene la lista de turnos de un contrato a partir del idContrato
	 * @param idContrato id del contrato
	 * @return resultado de la consulta
	 */
	public abstract ResultSet obtenTurnosDeContrato(int idContrato);

	/**
	 * Obtiene la lista de turnos de un contrato a partir del idEmpl
	 * @param idEmpl id del empleado
	 * @return resultado de la consulta
	 */
	public abstract ResultSet obtenTurnosDeContratoPorEmpleado(int idEmpl);

	/**
	 * recupera un mensaje de la base de datos indicando el numero del mismo
	 * 
	 * @param mensaje
	 *            indica el mensaje que se quiere recuperar por identificador de
	 *            mensaje
	 * @return ResulSet el mensaje indicado
	 */
	public abstract ResultSet obtenMensaje(int mensaje);

	public abstract ResultSet obtenMensajesEntrantes(int vendedor, int inicio,
			int desp);

	public abstract ResultSet obtenTodosMensajesEntrantes(int vendedor);

	/**
	 * Método que devuelve los mensajes salientes de un empleado ordenados por
	 * fecha
	 * 
	 * @param id
	 *            identificador de usuario
	 * @param inicio
	 *            fecha de inicio
	 * @param desp
	 *            intervalo de fechas que se quiere consultar
	 * @return ResulSet con los mensajes salientes solicitados
	 */
	public abstract ResultSet obtenMensajesSalientes(int id, int inicio,
			int desp);

	/**
	 * Metodo que obtiene todos los nombres del dpto.
	 * @return un ResultSet con todos los nombres de dpto.
	 */
	public abstract ResultSet obtenNombreTodosDepartamentos();

	/**
	 * 
	 * @param nvend
	 *            el identificador del empleado
	 * @return un ResultSet con el id del superior del empleado
	 */
	public abstract ResultSet obtenSuperior(int nvend);

	/**
	 * 
	 * @return devuelve todas las filas de la tabla CONTRATO
	 */
	public abstract ResultSet obtenTodosContratos();

	/**
	 * 
	 * @return devuelve todas las filas de la tabla DEPARTAMENTO
	 */
	public abstract ResultSet obtenTodosDepartamentos();

	/**
	 * Método que obtiene el Nombre completo (Nombres + Apellidos) de todos los jefes (usuarios de rango=2)
	 * 
	 * @return Devuelve un ResultSet con los datos leídos de la BD
	 */
	public abstract ResultSet obtenTodosNombresJefes();

	/**
	 * Método que obtiene todos los jefes (usuarios de rango=2)
	 * 
	 * @return Devuelve un ResultSet con los datos leídos de la BD
	 */
	public abstract ResultSet obtenTodosJefes();

	/**
	 * Metodo que obtiene los números asociados a algún dpto.
	 * @return un ResultSet con los números asociados a algún dpto.
	 */
	public abstract ResultSet obtenTodosNumerosDEPARTAMENTOs();

	/**
	 * Metodo que obtiene los numeros de vendedor de los jefes de dpto.
	 * @return un ResultSet con los ID's de los jefes de dpto.
	 */
	public abstract ResultSet obtenTodosNumVendedoresJefes();

	/**
	 * 
	 * @return devuelve todas las filas de la tabla TURNOS
	 */
	public abstract ResultSet obtenTodosTurnos();

	/**
	 * recupera un turno de la base de datos indicando el id del mismo
	 * 
	 * @param turno
	 *            identificador del turno
	 * @return el turno indicado
	 */
	public abstract ResultSet obtenTurno(int turno);

	/**
	 * Metodo que recoge el turno que le corresponde a un empleado en un dia
	 * concreto
	 * 
	 * @param dia
	 *            dia en el cual se quiere saber el turno del empleado
	 * @param idEmpleado
	 *            identificador del empleado
	 * @return ResultSet con el turno
	 */
	public abstract ResultSet obtenTurnoEmpleadoDia(Date dia, int idEmpleado);

	/**
	 * 
	 * @param nvend
	 *            Identificador del empleado
	 * @return devuelve la fila correspondiente al turno actual del empleado
	 */
	public abstract ResultSet obtenTurnoFavorito(int nvend);

	/**
	 * Método que lee todos los turnos de los contratos de un departamento
	 * 
	 * @param departamento el identificador del departamento
	 * @return Devuelve un ResultSet con los datos leídos de la BD
	 */
	public abstract ResultSet obtenTurnosDepartamento(String departamento);

	/**
	 * 
	 * @param idContrato
	 *            identificador del contrato
	 * @return ResultSet con los turnos que pertenecen al contrato dado
	 */
	public abstract ResultSet obtenTurnosDeUnContrato(int idContrato);

	public abstract void run();

	public abstract ResultSet trabajaEmpleadoDia(int nv, Date d);

	/**
	 * Metodo que obtiene un Dpto a partir de unos de sus números asociados
	 * 
	 * @param numero
	 *            numero asociado al dpto. que queremos obtener
	 * @return un ResultSet con el Dpto asociado a 'numero'
	 */
	public abstract ResultSet getDepartamentoPorNumero(int numero);

	/**
	 * Vacia los contenidos de la tabla especificada
	 * 
	 * @param nombre
	 *            El nombre de la tabla en formato String
	 * @return Devuelve un bool. True si ha ido todo bien, false en caso de
	 *         error.
	 */
	public abstract boolean vaciarTabla(String nombre);

	/**
	 * Metodo que elimina todas las tablas de la BBDD
	 * @return 
	 */
	public abstract void eliminarTodasLasTablas();

	/**
	 * Metodo que crea las tablas en la BBDD
	 * @return 
	 */
	public abstract void crearTablas();
	
	public abstract void crearDependencias();

	/**
	 * Insertar ventas para todos los empleados en nVends para 2008
	 * @param nVends Lista de identificadores de usuario a los que insertar ventas
	 */
	public abstract void insertarVentasACapon(ArrayList<Integer> idVends);

	public abstract boolean isIntentandoConectar();

	public abstract void setIntentandoConectar(boolean intentandoConectar);

}